package com.itheima.rabbitmq.work;

import com.itheima.rabbitmq.utils.ConnectionUtil;
import com.rabbitmq.client.*;

import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 * @author : [chenxys]
 * @version : [v1.0]
 * @Description : 工作模式下消费者
 * @createTime : [2022/6/22 19:29]
 */
public class Consumer1 {
    /**
     * 队列名称
     * QUEUE_NAME
     */
    static final String QUEUE_NAME = "work_queue";

    public static void main(String[] args) throws Exception {
        Connection connection = ConnectionUtil.getConnection();
        // 4、创建channel
        Channel channel = connection.createChannel();

        // 5、创建队列
        /*
         * 1、queue：队列名称
         * 2、durable：是否持久化[当mq重启后,仍然存在]
         * 3、exclusive：一般设置为 false
         *       * 是否独占：只能有一个消费者监听该条队列
         *       * 当Connection关闭时，是否删除队列
         * 4、autoDelete：是否自动删除。当没有Consumer时,自动删除
         * 5、arguments：队列其它参数
         * */
        //如果没有一个名为QUEUE_NAME的队列,则会自动创建该队列,反之则不会
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);

        //一次只能接收并处理一个消息
        channel.basicQos(1);

        // 创建消费者；并设置消息处理
        DefaultConsumer consumer = new DefaultConsumer(channel){
            /**
             * 设置消息处理
             * @author chenxys
             * @param consumerTag 消息者标签，在channel.basicConsume时候可以指定
             * @param envelope 消息包的内容，可从中获取消息id，消息routingkey，交换机，消息和重传标志(收到消息失败后是否需要重新发送)
             * @param properties 属性信息
             * @param body 消息
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                try {
                    //收到的消息
                    System.out.println("消费者1-接收到的消息为:" + new String(body, StandardCharsets.UTF_8));
                    Thread.sleep(100);
                    //确认消息
                    channel.basicAck(envelope.getDeliveryTag(),false);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        // 监听消息
        /*basicConsume(String queue, boolean autoAck, Consumer callback)
         * 1、queue：队列名称
         * 2、autoAck：是否自动确认，
         *       * 设置为true为表示消息接收到自动向mq回复接收到了，mq接收到回复会删除消息，
         *       * 设置为false则需要手动确认
         * 3、callback：消息接收到后回调
         * */
        channel.basicConsume(QUEUE_NAME,false,consumer);
    }
}
